package com.osgix.common.pojo;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 
 * <b>权限对象，一个资源的权限值是 2^0 ~ 2^29，每一位可以表示对资源的一种操作权限，最多允许为一个资源定义３０种操作</b>
 */
public class Privilege implements Serializable {

	/**
	 * 2009-4-29,下午03:44:51
	 */

	private static final long serialVersionUID = 2353317366275074720L;

	/**
	 * 半选状态，权限值的第30位，2^30,表权限处于虚选中的状态。一般出现在下级节点部分被选中时，在授权时，处理虚选中状态的资源可见，但不可进行操作。
	 */
	public static final long HALF_PRIVILEGE = 0x40000000L;

	/**
	 * 最大权限,2^0 ~ 2^29，每一位可以表示对资源的一种操作权限，最多允许为一个资源定义30种操作,允许多个权限值
	 */
	public static final long ROOT_ALL_PRIVILEGE = 0x3FFFFFFFL;

	/**
	 * 默认的权限索引，即保存在security_privilege表中的第一个权限
	 */
	public static final String DEFAULT_PRIVILEGE_KEY = "p0";

	/**
	 * 资源编号
	 */
	private String resourceId = "";

	/**
	 * 所属角色
	 */
	private String roleId = "";

	/**
	 * 权限值
	 */
	private long privileges = 0;

	/**
	 * URL
	 */
	private String url = "";

	/**
	 * 访问类型
	 */
	private String accessType = "";

	/**
	 * 对应security_privilege_value表中的privilege_id
	 */
	private String id;

	/**
	 * 应用系统名称
	 */
	private String appName;

	/**
	 * 多个权限值
	 */
	private Map<String, Long> privilege = new HashMap<String, Long>();

	/**
	 * 对应权限值的选择状态 0 不选，1选择，2半选
	 */
	private int checked;

	/**
	 * 保存页面数据，表示节点在页面上是否有子节点
	 */
	private boolean hasChild;

	/**
	 * 构造函数
	 *
	 */
	public Privilege() {

	}

	/**
	 * 构造函数
	 * @param id
	 * @param roleId
	 * @param url
	 * @param accessType
	 * @param value
	 */
	public Privilege(String resourceId, String roleId, String url, String accessType, long value, String id,
			String app_name) {
		this.resourceId = resourceId;
		this.roleId = roleId;
		this.url = url;
		this.accessType = accessType;
		this.privileges = value;
		this.id = id;
		this.appName = app_name;
	}

	public Object clone() {
		Privilege privilege = new Privilege(resourceId, roleId, url, accessType, privileges, id, appName);
		return privilege;
	}

	public boolean equals(Object obj) {
		if (obj instanceof Privilege) {
			Privilege objPrivilege = (Privilege) obj;
			if (resourceId != null && resourceId.equals(objPrivilege.getResourceId()) && roleId != null
					&& roleId.equals(objPrivilege.getRoleId()))
				return true;
		}
		return false;
	}

	public String toString() {
		return resourceId + "/" + roleId + "/" + accessType + "/" + privileges + "/" + url + "/" + id + "/" + appName
				+ "/" + privilege;
	}

	public String getAccessType() {
		return accessType;
	}

	public void setAccessType(String accessType) {
		this.accessType = accessType;
	}

	public String getResourceId() {
		return resourceId;
	}

	public long getPrivileges() {
		return privileges;
	}

	public String getPrivilegeBinary() {
		return Long.toBinaryString(privileges);
	}

	public void setPrivilegeBinary(String binaryStr) {
		privileges = new Long(binaryStr).longValue();
	}

	public void setPrivileges(long privileges) {
		this.privileges = privileges;
	}

	public void setResourceId(String resourceId) {
		this.resourceId = resourceId;
	}

	public String getRoleId() {
		return roleId;
	}

	public void setRoleId(String roleId) {
		this.roleId = roleId;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getAppName() {
		return appName;
	}

	public void setAppName(String appName) {
		this.appName = appName;
	}

	public Map<String, Long> getPrivilege() {
		return privilege;
	}

	public void setPrivilege(Map<String, Long> privilege) {
		this.privilege = privilege;
	}

	public int getChecked() {
		return checked;
	}

	public void setChecked(int checked) {
		this.checked = checked;
	}

	public boolean isHasChild() {
		return hasChild;
	}

	public void setHasChild(boolean hasChild) {
		this.hasChild = hasChild;
	}
}
